home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource5 / 349_01 / sss.arc / EX_0701.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-04-10  |  2.7 KB  |  137 lines

  1. program EX_0701;
  2. {Listing 14P - see documentation in TUTOR.SSS}
  3.  
  4. uses SSS;
  5. { For Pascal other than Turbo/Quick erase above line }
  6.  
  7. const
  8.   ARRIVL = 1;
  9.   STARTA = 2;
  10.   ENDACT = 3;
  11.   NEXTAC = 4;
  12.  
  13.   ORD1   = 1;
  14.   ORD2   = 2;
  15.   DELUX1 = 3;
  16.   DELUX2 = 4;
  17.  
  18. { For MS Pascal $include:'SSSP1.H' }
  19.  
  20. var
  21.   s, ecode : integer;
  22.   server   : array[1..2] of integer;
  23.  
  24. { For MS Pascal $include:'SSSP2.H' }
  25.  
  26. procedure prime;
  27. begin
  28.   server[1] := 1;
  29.   server[2] := 1;
  30.   INIQUE(5,3,1);
  31.   INISTA(1,'Interrupts',0,0,0,0);
  32.   SIMEND(60);
  33.   CREATE(0, 0);
  34. end;
  35.  
  36. function sindex: integer;
  37. begin
  38.   if IDE < DELUX1 then sindex := IDE
  39.   else                 sindex := IDE - ORD2;
  40. end;
  41.  
  42. function shortr: integer;
  43. begin
  44.   if NQ(4) + NQ(2) < NQ(3) + NQ(1) then
  45.     SETIDE(IDE + 1);
  46.   shortr := IDE
  47. end;
  48.  
  49. procedure preemp;
  50. var i, preide: integer; remt: real;
  51.  
  52. begin
  53.   QUEUE(5, 0);
  54.   i := 1;
  55.   while ((i <= NC) and
  56.    ((IDIC(i) > ORD2) or (NEIC(i) <> ENDACT))) do
  57.      i := i + 1;
  58.   if i <= NC then
  59.  
  60.   begin
  61.     remt := TIC(i) - T;
  62.     REMVFC(i);
  63.     preide := IDE;
  64.     SETA(1, A(1) + 1);
  65.     SETA(2, remt);
  66.     SETQDC(1,'LIFO');
  67.     QUEUE(IDE, 0);
  68.     SETQDC(1,'FIFO');
  69.     REMVFQ(5,1);
  70.     SCHED(0, STARTA, preide+2);
  71.   end
  72.  
  73.   else
  74.   begin
  75.     REMVFQ(5,1);
  76.     QUEUE(shortr, 0);
  77.   end;
  78. end;
  79.  
  80. begin
  81.  
  82.   prime;
  83.  
  84.   repeat
  85.     ecode := NEXTEV;
  86.     if ecode > 0 then
  87.     begin
  88.       case ecode of
  89.  
  90.       ARRIVL: begin
  91.                 CREATE(EX(2), 0);
  92.                 SETA(1, 0);
  93.                 SETA(2, TR(1,2,3));
  94.                 if RA < 0.25 then SETIDE(DELUX1)
  95.                 else              SETIDE(ORD1  );
  96.                 SCHED(0, NEXTAC, IDE);
  97.               end;
  98.  
  99.       NEXTAC: if server[1] > 0 then
  100.                 SCHED(0, STARTA, IDE  )
  101.               else if server[2] > 0 then
  102.                 SCHED(0, STARTA, IDE+1)
  103.               else if IDE = DELUX1 then
  104.                 preemp
  105.               else
  106.                 QUEUE(shortr, 0);
  107.  
  108.       STARTA: begin
  109.                 server[sindex] := server[sindex] - 1;
  110.                 SCHED(A(2), ENDACT, IDE);
  111.               end;
  112.  
  113.       ENDACT: begin
  114.                 s := sindex;
  115.                 server[s] := server[s] + 1;
  116.                 if IDE < DELUX1 then TALLY(1, A(1));
  117.                 DISPOS;
  118.                 if NQ(s + 2) > 0 then
  119.                 begin
  120.                   REMVFQ(s + 2, 1);
  121.                   SCHED(0, STARTA, IDE);
  122.                 end
  123.  
  124.                 else if NQ(s) > 0 then
  125.                 begin
  126.                   REMVFQ(s, 1);
  127.                   SCHED(0, STARTA, IDE);
  128.                 end;
  129.               end;
  130.       end;
  131.     end;
  132.   until ecode = 0;
  133.  
  134.   SUMRY('');
  135.  
  136. end.
  137.